package cn.tedu.charging.order.rabbitmq;

import cn.tedu.charging.order.config.RabbitMQConfiguration;
import cn.tedu.charging.order.dao.repository.OrderRepository;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Slf4j
@Component
public class RabbitMQConsumer {


    @Autowired
    private OrderRepository orderRepository;

    /**
     * 通过Spring 封装好的  @RabbitListener 来消费消息
     * queues 用来指定要消费的队列  charging_order_queue
     * @param orderNo
     * 8. 死信队列的消费者消费到消息后 ，判断订单的状态
     * 9. 正常情况 在消息过期之前 订单完成 订单的状态是 充电完成
     * 10. 正常情况 下 无需处理
     * 11. 异常情况 在消息过期时，订单还没有完成，订单的状态时 充电中
     * 12. 异常情况 修改订单的状态为 异常结束
     */
    @RabbitListener(queues = RabbitMQConfiguration.DEAD_LETTER_QUEUE_NAME)
    public void receive(String orderNo, Message message , Channel channel) {
        log.debug("消费到延迟消息:{}",orderNo);
        log.debug("修改订单状态为充电中的改为异常结束");
        Integer row = orderRepository.updateOrderStatusFromChargingToAbnormalEnd(orderNo);
        if (row == 0) {
            log.debug("没有更新数据，表示订单正常结束，设备没有出现故障");
        }else {
            log.debug("更新数据，表示订单异常结束，设备出现故障");
            log.debug("通知充电用户");//技术和业务的平衡
            log.debug("通知设备管理员");
        }

        //手动ack 消费者成功消费完消息后，业务处理成功，告诉RabbitMQ 消息已经消费完，可以删除消息了
        try {
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
}